#pragma once

#include <sw/redis++/redis.h>
#include <iostream>
namespace chat_server
{
    using Redis = std::shared_ptr<sw::redis::Redis>;
    class RedisClientFactory
    {
    public:
        static Redis create(const std::string &host,
                            int port,
                            int db,
                            bool keep_alive)
        {
            sw::redis::ConnectionOptions opts;
            opts.host = host;
            opts.port = port;
            opts.db = db;
            opts.keep_alive = keep_alive;
            return std::make_shared<sw::redis::Redis>(opts);
        }
    };
    // 1.session管理
    class Session
    {
    public:
        using ptr = std::shared_ptr<Session>;
        Session(const Redis &redis)
            : _redis_client(redis) {}
        // 创建session
        void append(const std::string &ssid, const std::string &uid)
        {
            _redis_client->set(ssid, uid);
        }
        // 删除session
        void remove(const std::string &ssid)
        {
            _redis_client->del(ssid);
        }
        // 获取session
        sw::redis::OptionalString uid(const std::string &ssid)
        {
            return _redis_client->get(ssid);
        }

    private:
        Redis _redis_client;
    };
    // 2. 登录状态
    class Status
    {
    public:
        using ptr = std::shared_ptr<Status>;
        Status(const Redis &redis)
            : _redis_client(redis) {}

        void append(const std::string &uid)
        {
            _redis_client->set(uid, "");
        }

        void remove(const std::string &uid)
        {
            _redis_client->del(uid);
        }
        // 判断是否退出
        bool exists(const std::string &uid)
        {
            auto res = _redis_client->get(uid);
            if (res)
                return true;
            return false;
        }

    private:
        Redis _redis_client;
    };
    // 验证码
    class Codes
    {
    public:
        using ptr = std::shared_ptr<Codes>;
        Codes(const Redis &redis)
            : _redis_client(redis) {}

        void append(const std::string &cid, const std::string &code)
        {
            _redis_client->set(cid, code, std::chrono::milliseconds(60000));
        }

        void remove(const std::string &cid)
        {
            _redis_client->del(cid);
        }

        sw::redis::OptionalString code(const std::string &cid)
        {
            return _redis_client->get(cid);
        }

    private:
        Redis _redis_client;
    };
}
